//权限拦截在路由跳转 导航守卫

import router from "@/router"
import store from "@/store" //引入store实例,和组件的this.$store是一回事
import nProgress from "nprogress"
import 'nprogress/nprogress.css'
//不需要导出, 因为在mian.js 执行代码了
//前置守卫
//next是前置守卫必须执行的钩子 next必须执行 如果不执行页面就死了
// next()放过
// next(false)跳转终止
//next(地址) 跳转到地址
const whiteList = ['/login', '404'] //定义白名单
router.beforeEach(async(to, from, next) => {
        nProgress.start() //开启进度条
        if (store.getters.token) {
            //如果有token
            if (to.path === '/login') {
                //如果是访问是登录页
                next('/') //跳到主页
            } else {
                //登录后判断是有有用户信息,此处用用户ID判断
                if (!store.getters.userId) {
                    const { roles } = await store.dispatch('user/getUserInfo') //调用user仓库调用用户信息 await需要同步执行,防止没获取用户信息就直接进入首页
                    const routes = await store.dispatch('permission/filtersRoutes', roles.menus) //调用permission仓库,管理动态路由
                    router.addRoutes([...routes, { path: '*', redirect: '/404', hidden: true }])
                    next(to.path)
                } else {
                    next()
                }

            }
        } else {
            //没有token的情况下 
            //判断是否白名单里的地址里
            if (whiteList.indexOf(to.path) > -1) {
                next()
            } else {
                next('/login')
            }
        }
        nProgress.done() //解决手动切换地址时,关闭进度条
    })
    //后置守卫
router.afterEach(
    () => { nProgress.done() } //关闭进度条
)